﻿// 3716. 命名法.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <vector>


using namespace std;
/*
https://www.acwing.com/problem/content/3719/


驼峰式命名法：当变量名或函数名是由一个或多个单词连结在一起，而构成的唯一识别字时，第一个单词以小写字母开始；
从第二个单词开始以后的每个单词的首字母都采用大写字母，例如：myFirstName、myLastName，这样的变量名看上去就像骆驼峰一样此起彼伏，故得名。

下划线命名法：名称中的每一个逻辑点都用一个下划线来标记，例如：print_employee。
下划线命名法是随着 C 语言的出现流行起来的，在 UNIX/LINUX 这样的环境，以及 GUN 代码中使用非常普遍。

现在给定你一个驼峰式命名法命名的变量名，请你将其转化为下划线命名法命名后输出。

输入格式
输入包含多组测试数据。

每组数据占一行，包含一个驼峰式命名法命名的变量名。

输出格式
每组数据输出一行结果，表示对应的下划线命名法命名。

数据范围
输入最多包含 100
 组数据。
每个输入字符串的长度不超过 100
 且只包含大小写字母。

输入样例：
myFirstName
myLastName
hbQoupyxeG
输出样例：
my_first_name
my_last_name
*/


string s;

void solve(string s) {
	int l = 0; int r = 0;
	vector<string> vs;
	while (l < s.size() ) {
		while (r < s.size() && s[r] >= 'a' && s[r] <= 'z') { r++; }
		string t = s.substr(l, r - l);
		vs.push_back(t);
		l = r; r = l+1;
	}

	string ans;
	for (int i = 0; i < vs.size(); i++) {
		if (vs[i][0] >= 'A' && vs[i][0] <= 'Z') {
			vs[i][0] = vs[i][0] - 'A' + 'a';
		}
		ans += vs[i]; ans += "_";
	}
	ans = ans.substr(0, ans.size() - 1);
	
	cout << ans << endl;
	return;
}

int main()
{
	while (cin >> s) {
		solve(s);
	}

	return 0;
}

 